<?php
/**
 * Core_Acl_Role
 * 
 * @author naspeh
 * @version $Id: Role.php 666 2008-06-30 08:22:59Z naspeh $
 */
class Core_Acl_Role implements Zend_Acl_Role_Interface
{
    /**
     * Массив характеризующий роль
     *
     * @var array
     */
    protected $_row;
    /**
     * Коструктор
     *
     * @param  Zend_Db_Table_Row_Abstract|array|string $role
     * @return void
     */
    public function __construct($role)
    {
        if ($role instanceof Zend_Db_Table_Row_Abstract) {
        	$row = $role->toArray();
        } elseif (is_array($role)) {
            $row = $role;
        } else {
            $tableRoles = new Core_Table_Roles();
            if (null == ($row = $tableRoles->fetchRow(array('name = ?' => $role)))) {
                throw new Core_Exception('roleNotFound# Не найдена роль:' . $role);
            } else {
                $row = $row->toArray();
            }
        }
        $this->_row = $row;
    }
    /**
     * Возвращает индификатор роли
     *
     * @return string
     */
    public function getRoleId()
    {
        return $this->id;
    }
    /**
     * Активиреет роль в объекте Acl
     *
     * @param Zend_Acl $acl
     * @return Zend_Acl
     */
    public function active(Zend_Acl & $acl)
    {
        if (!$acl->hasRole($this)) {
            $tableRolesTies = new Core_Table_RoleTies();
            $rowset = $tableRolesTies->fetchAll(array('role_id = ?' => $this->getRoleId()));
            $parents = array();
            $tableRoles = new Core_Table_Roles();
            foreach ($rowset as $row) {
                $parent = $tableRoles->fetchRow(array('id = ?' => $row->parent));
                $parent = new Core_Acl_Role($parent);
                $acl = $parent->active($acl);
                $parents[] = $parent->getRoleId();
            }
            $acl->addRole($this, $parents);
        }
        return $acl;
    }    
    /**
     * Возвращает значение параметра
     *
     * @param string $name
     * @return mixed
     */    
    public function getRow($name = null)
    {
        if (is_null($name)) {
            return $this->_row;
        } elseif (isset($this->_row[$name])) {
            return $this->_row[$name];
        } else {
            return null;
        }
    }
    /**
     * Возвращает значение параметра
     *
     * @param string $name
     * @return mixed
     */
    public function __get($name)
    {
        return $this->getRow($name);
    }
}
